package com.mmc.delay.api;




import com.mmc.delay.bean.DeadJob;
import com.mmc.delay.bean.Job;
import com.mmc.delay.bean.JobParam;

import java.util.List;
import java.util.Set;

public interface DelayFacade<T extends JobParam> {
    /**
     * 移动delay里的可执行消息到ready里面
     * @return  返回移动后最近的一个消息的runTime
     */
    long moveAndRtNextRunTime(String partition);

    boolean addJob(T jobParam, int currentRetryTime);

    boolean addJob(T jobParam);

    List<Job> popReadyJob();

    boolean removeJob(String jobId);

    boolean tryRetry(Job job);

    /**
     * 给定时任务弄个简单的分布式锁，保证timer单个运行
     * param second  单位秒
     * @return
     */
    boolean lockTimer(String key, String value, Long second);

    /**
     * value一致才能解锁
     * @return
     */
    boolean unlock(String key, String value);

    List<Job> queryDelayData(String topic, Long start, Long end);

    Long queryDelayRecordNum(String topic);

    List<DeadJob> queryDeadData(String topic, Long start, Long end);

    Long queryDeadRecordNum(String topic);

    void removeDeadJob(DeadJob deadJob);

    Set<String> queryAllTopics();

    Set<String> queryStopTopics();

    /**
     * 停止某个topic的任务执行
     * @param topic
     */
    void stopTopic(String topic);

    /**
     * 重新开启某个topic的任务执行
     * @param topic
     */
    void startTopic(String topic);
}
